Crossplane 简介

crossplane 可将 Kubernetes 集群连接到外部非 Kubernetes 资源,并允许平台团队构建定制的 Kubernetes API 来使用这些资源。

Crossplane 会创建 Kubernetes Custom Resource Definitions (CRDs),将外部资源表示为本地 Kubernetes 对象。作为本地 Kubernetes 对象,你可以使用kubectl createkubectl describe 等标准命令。每个 Crossplane 资源都可以使用完整的 Kubernetes API

Crossplane 还充当Kubernetes 控制器,观察外部资源的状态并提供状态执行。如果有东西修改或删除了 Kubernetes 外部的资源,Crossplane 会逆转更改或重新创建被删除的资源。

Diagram showing a user communicating to Kubernetes. Crossplane connected to Kubernetes and Crossplane communicating with AWS, Azure and GCP
在Kubernetes集群中安装Crossplane后,用户只与Kubernetes通信,Crossplane则管理与外部资源(如AWS、Azure或谷歌云)的通信。

crossplane 还允许创建自定义 Kubernetes API。 平台团队可以结合外部资源,简化或自定义呈现给平台消费者的 API。

crossplane 组件概览

本表概述了 crossplane 组件及其作用。

Component Abbreviation Scope Summary
Provider cluster Creates new Kubernetes Custom Resource Definitions for an external service.
ProviderConfig PC cluster Applies settings for a Provider.
Managed Resource MR cluster A Provider resource created and managed by Crossplane inside the Kubernetes cluster.
Composition cluster A template for creating multiple managed resources at once.
Composite Resources XR cluster Uses a Composition template to create multiple managed resources as a single Kubernetes object.
CompositeResourceDefinitions XRD cluster Defines the API schema for Composite Resources and Claims
Claims XC namespace Like a Composite Resource, but namespace scoped.

The Crossplane Pod

Crossplane 安装在 Kubernetes 集群中时,会创建一组 Crossplane 核心组件的初始自定义资源定义(CRD)。

安装 Crossplane 后,使用 kubectl get crds 查看已安装的 Crossplane CRD。

 1❯ kubectl get crd
 2NAME                                                    
 3compositeresourcedefinitions.apiextensions.crossplane.io
 4compositionrevisions.apiextensions.crossplane.io        
 5compositions.apiextensions.crossplane.io                
 6configurationrevisions.pkg.crossplane.io                
 7configurations.pkg.crossplane.io                        
 8controllerconfigs.pkg.crossplane.io                     
 9deploymentruntimeconfigs.pkg.crossplane.io              
10environmentconfigs.apiextensions.crossplane.io          
11functionrevisions.pkg.crossplane.io                     
12functions.pkg.crossplane.io                             
13locks.pkg.crossplane.io                                 
14providerrevisions.pkg.crossplane.io                     
15providers.pkg.crossplane.io                             
16storeconfigs.secrets.crossplane.io                      
17usages.apiextensions.crossplane.io

下文将介绍其中一些 CRD 的功能。

Providers

Crossplane _Provider_创建了第二套CRD,定义了Crossplane如何连接到非Kubernetes服务。 每个外部服务都依赖于自己的Provider。例如,AWSAzureGCP是每个云服务的不同提供商。

Tip
大多数 Provider 是针对云服务的,但 crossplane 可以使用 Provider 连接到任何具有 API 的服务。

例如,AWS Provider 为 EC2 计算实例或 S3 存储桶等 AWS 资源定义 Kubernetes CRD。

Provider 定义了外部资源的 Kubernetes API 定义。例如,Upbound Provider AWS 定义了用于创建和管理 AWS S3 存储桶的 bucket资源。

bucketCRD中,有一个spec.forProvider.region值,用于定义在哪个AWS区域部署bucket。

Upbound Marketplace 包含大量crossplane Providers 集合

更多 Provider 可在 Crossplane Contrib 资源库 中找到。

Provider 具有集群作用域,可用于所有集群名称空间。

使用命令 kubectl get providers 查看所有已安装的 Provider。

Provider 配置

ProviderConfigs 配置与 Provider 相关的设置,如身份验证或 Provider 的全局默认值。

ProviderConfigs 的 API 端点对每个 Provider 都是唯一的。

ProviderConfigs 具有集群作用域,可用于所有集群名称空间。

使用命令 kubectl get providerconfig 查看所有已安装的 ProviderConfigs。

受托管的资源

Provider 的 CRD 映射到 Provider 内部的单个 资源。 当 crossplane 创建并监控一个资源时,它就是一个 受管资源

使用 Provider 的 CRD 会创建一个唯一的 Managed Resource。 例如,使用 AWS 的 bucket CRD,crossplane 会在 Kubernetes 集群内创建一个连接到 AWS S3 存储桶的 bucket Managed Resource

Crossplane 控制器为 Managed Resources 提供状态执行。 Crossplane 执行 Managed Resources 的设置和存在。这种 “控制器模式 “就像 Kubernetes kube-controller-manager 为 pod 执行状态一样。

托管资源 具有集群作用域,可用于所有集群名称空间。

使用 kubectl get managed 查看所有_受管资源_。

Warning

kubectl get managed 会创建大量 Kubernetes API 查询。 kubectl 客户端和 kube-apiserver 都会限制 API 查询。

根据 API 服务器的大小和托管资源的数量,该命令可能需要几分钟才能返回,也可能会超时。

更多信息,请阅读 Kubernetes issue #111880Crossplane issue #3459

Compositions

组件允许平台团队将一组_托管资源_定义为单一对象。

例如,一个计算_托管资源_可能需要创建一个存储资源和一个虚拟网络。 一个_composition_对象可以在一个_composition_对象中定义所有这三种资源。

使用 Compositions 可简化由多个_managed resources_composition的基础架构的部署。

平台团队可为_Composition_内的每个_managed resource_定义固定或默认设置,或定义用户可更改的字段和设置。

使用前面的例子,平台团队可能会设置计算资源大小和虚拟网络设置。 但平台团队允许用户定义存储资源大小。

创建 Composition crossplane 并不创建任何受管资源。 Composition 只是一个模板,用于集合 managed resources 及其设置。 Composite Resource 创建特定资源。

Note
复合资源 部分讨论了_复合资源_。

Compositions 具有集群作用域,可用于所有集群名称空间。

使用 kubectl get compositions 查看所有_compositions_。

Composition Resources

一个 Composite Resource (XR)是一组已调配的_managed resources_。 一个 Composite Resource 使用一个 Composition 所定义的模板,并应用任何用户定义的设置。

多个唯一的 Composite Resource 对象可以使用同一个 Composition 。 例如,一个 Composition 模板可以创建一组计算、存储和网络的 managed resources。 每次用户请求这组资源时,crossplane 都会引用同一个 Composition 模板。

如果 Composition 允许用户定义资源设置,用户就会在 Composite Resource 中应用这些设置。

Tip

Compositions 是一组_managed resources_ 的模板。Composite Resources 填充模板并创建_managed resources_。

删除_复合资源_会删除它创建的所有_托管资源_。

Composite Resources 具有集群作用域,可用于所有集群名称空间。

使用 kubectl get composite 查看所有 _Composite 资源。

复合资源定义

Composite Resource Definitions (XRDs)创建了_Claims_和_Composite Resources_所引用的自定义 Kubernetes API。

Note
claim](#claims) 部分讨论了_claim_。

平台团队可以定义自定义 API。 这些 API 可以定义以千兆字节为单位的存储空间等特定值、“小 “或 “大 “等通用设置、“云 “或 “onprem “等部署选项。 crossplane 不会限制 API 的定义。

Composite Resource Definition 的 kind 来自 crossplane。

1apiVersion: apiextensions.crossplane.io/v1
2kind: CompositeResourceDefinition

复合资源定义_的 spec 创建了_复合资源_的 apiVersionkindspec

Tip
复合资源定义_定义了_复合资源_的参数。

一个 Composite Resource Definition 有四个主要的 spec 参数:

  • A

来定义apiVersion中定义 apiVersion。

  • 版本.名称 版本.名称

定义了_复合资源_中被引用的版本。

  • A names.kind

来定义_复合资源_______。种类.

  • A 版本模式部分

来定义_复合资源_。 规格.

1# Composite Resource Definition (XRD)
2spec:
3  group: test.example.org
4  names:
5    kind: myComputeResource
6  versions:
7  - name: v1alpha1
8    schema:
9      # Removed for brevity

基于该_复合资源定义_的_复合资源_看起来像这样:

1# Composite Resource (XR)
2apiVersion: test.example.org/v1alpha1
3kind: myComputeResource
4metadata:
5  name: myResource
6spec:
7  storage: "large"

复合资源定义 模式定义了_复合资源_的规格参数。

这些参数是新的、自定义的 API,开发人员可以使用。

例如,创建计算_托管资源_需要了解云 Provider 的计算类名称,如 AWS 的 m6in.large 或 GCP 的 e2-standard-2

Composite Resource Definition 可将选项限制为 “小 “或 “大”。 Composite Resource 被引用这些选项,而 Composition 则将其映射到特定的云提供商设置。

下面的_复合资源定义_定义了一个 存储空间存储空间是一个字符串和 OpenAPI要求选项必须是 .

 1# Composite Resource Definition (XRD)
 2spec:
 3  group: test.example.org
 4  names:
 5    kind: myComputeResource
 6  versions:
 7  - name: v1alpha1
 8    served: true
 9    referenceable: true
10    schema:
11      openAPIV3Schema:
12        type: object
13        properties:
14          spec:
15            type: object
16            properties:
17              storage:
18                type: string
19                oneOf:
20                  - pattern: '^small$'
21                  - pattern: '^large$'
22            required:
23            - storage

一个_复合资源定义_可以定义多种设置和选项。

创建_复合资源定义_可以创建_复合资源_,但也可以创建_claim_。

带有 spec.claimNamesComposite Resource Definition 允许开发人员创建 Claims

例如claimNames.kind允许创建 kind: computeClaim 的 _Claims。

1# Composite Resource Definition (XRD)
2spec:
3  group: test.example.org
4  names:
5    kind: myComputeResource
6  claimNames:
7    kind: computeClaim
8  # Removed for brevity

claims

claim是开发人员与 crossplane 交互的主要方式。

Claims 访问平台团队在 Composite Resource Definition 中定义的自定义应用程序接口。

Claims 看起来像 Composite Resources,但它们是 namespace 作用域,而 Composite Resources 是集群作用域。

Note

为什么名称空间范围很重要? 具有名称空间范围的 Claims 允许多个团队使用唯一的名称空间创建相同类型的资源,且相互独立。 团队 A 的计算资源与团队 B 的计算资源是唯一的。

直接创建 Composite Resources 需要集群范围内的权限,并与所有团队共享。Claims 创建相同的资源集,但在 namespace 层面上。

之前的_复合资源定义_允许创建_claim_类型的computeClaim.

claim被引用相同的apiVersion中定义的 apiVersion,Composite Resource Definition 中定义的 apiVersion 也被_Composite Resources_ 引用。

1# Composite Resource Definition (XRD)
2spec:
3  group: test.example.org
4  names:
5    kind: myComputeResource
6  claimNames:
7    kind: computeClaim
8  # Removed for brevity

Claim 的示例中apiVersion中的组。

claim 类型与_复合资源定义_匹配。claimNames.kind.

1# Claim
2apiVersion: test.example.org/v1alpha1
3kind: computeClaim
4metadata:
5  name: myClaim
6  namespace: devGroup
7spec:
8  size: "large"

一个 Claim 可以安装在一个 namespace 中。复合资源定义_定义了规格选项的方式与_复合资源_的方式相同规格.

Tip
Composite ResourcesClaims 是相似的。 只有 Claims 可以在一个命名空间中。 名称空间。此外,_复合资源_的 种类可能不同于_Claim_的种类。Composite Resource Definition 定义了种类Values 的值。
1# Composite Resource (XR)
2apiVersion: test.example.org/v1alpha1
3kind: myComputeResource
4metadata:
5  name: myResource
6spec:
7  storage: "large"

Claims 是 namespace 作用域。

使用命令 kubectl get claim 查看所有可用的 claims。

下一步

使用其中一个快速入门指南,构建自己的 crossplane 平台。